home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume2 / dos / fs / fnams22.1 < prev   
Text File  |  1988-12-30  |  21KB  |  611 lines

  1. Path: xanth!nic.MR.NET!csd4.milw.wisc.edu!mailrus!ulowell!page
  2. From: page@swan.ulowell.edu (Bob Page)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v02i112:  fnams - produce cmd files for zoo 'I' option v2.2
  5. Message-ID: <11031@swan.ulowell.edu>
  6. Date: 30 Dec 88 21:25:37 GMT
  7. Organization: University of Lowell, Computer Science Dept.
  8. Lines: 600
  9. Approved: page@swan.ulowell.edu
  10.  
  11. Submitted-by: d87sg@efd.lth.se (Svante Gellerstam)
  12. Posting-number: Volume 2, Issue 112
  13. Archive-name: dos/fs/fnams22.1
  14.  
  15. Since I'm the original author of fnams I thought that I should save
  16. the world with this update.  This is v2.2 and it is a much safer
  17. program than v1.0.
  18.  
  19. [uuencoded binary included.  ..Bob]
  20.  
  21. #    This is a shell archive.
  22. #    Remove everything above and including the cut line.
  23. #    Then run the rest of the file through sh.
  24. #----cut here-----cut here-----cut here-----cut here----#
  25. #!/bin/sh
  26. # shar:    Shell Archiver
  27. #    Run the following text with /bin/sh to create:
  28. #    readme
  29. #    fnams.man
  30. #    history
  31. #    zooall
  32. #    makefile
  33. #    fnams.c
  34. #    fnams.uu
  35. # This archive created: Fri Dec 30 16:21:44 1988
  36. cat << \SHAR_EOF > readme
  37.  
  38.       Fnams is a simple filter for producing cmd-files for the 'I' option
  39.    of the Zoo archiver. This makes the zooing of entire directory trees
  40.    very easy. This is version 2.2 and will compile under Lattice 4.0 &
  41.    (hopefully) Aztec.
  42.  
  43.         Under both compilers:
  44.  
  45.                 - Dynamically allocated structures allowing for directory
  46.                   trees of almost indefinite depth.
  47.  
  48.         Under Lattice 4.0:
  49.  
  50.                 - Exits cleanly when user hits Ctrl-C.
  51.  
  52.  
  53.    This archive should contain:
  54.  
  55.         fnams           - executable.
  56.         fnams.c         - C-source for the Lattice 4.0 C-compiler.
  57.         fnams.man       - Documentation pages for fnams.
  58.         history         - Revision history.
  59.         readme          - This file.
  60.         zooall          - Simple script for zooing the tree beginning @
  61.                           current directory.
  62.  
  63.    /svante
  64.  
  65. SHAR_EOF
  66. cat << \SHAR_EOF > fnams.man
  67.         NAME
  68.                 FNAMS - a filter program for the ZOO archiver. Amiga
  69.                 version.
  70.  
  71.         SYNOPSIS
  72.                 FNAMS <directory>
  73.                 FNAMS <unit>
  74.                 FNAMS ""
  75.  
  76.         DESCRIPTION
  77.                 FNAMS will produce a listing on stdout of all files under
  78.                 the given directory/unit with their full pathnames. Thus
  79.                 FNAMS is a complement to the ZOO archiver. The first
  80.                 objective is to provide a easy way to archive entire
  81.                 directory structures.
  82.  
  83.  
  84.                 The intended use is as follows:
  85.  
  86.                 First produce a listing of the desired directory using
  87.                 FNAMS:
  88.  
  89.                         FNAMS > <tempfile> <dirpath>
  90.  
  91.                 Then use <tempfile> together with the ZOO option I:
  92.  
  93.                         ZOO < <tempfile> aI <archivename>
  94.  
  95.  
  96.                 ZOO will then put into <archivename> all files described in
  97.                 <tempfile>.
  98.  
  99.  
  100.         FILES
  101.                 <tempfile>
  102.  
  103.         SEE ALSO
  104.                 ZOO documentation.
  105.  
  106.         BUGS
  107.                 None known... (Big lie this was - see the revision history
  108.                 :-)
  109.  
  110.         DIAGNOSTICS
  111.                 Fnams will produce error messages when it can't Examine()
  112.                 directories etc. All error messages starts with '!!!'.
  113.                 Unfortunately the error output goes through the same
  114.                 channel as the ordinary output. This might cause problem -
  115.                 check for it if you run into trouble.
  116.                 When FNAMS is run with no parameter given, it will produce
  117.                 the usual 'Usage:...' message.
  118.  
  119.         THANKS TO
  120.                 Lattice for including those hints on how to squeeze
  121.                 filesize to a minimum.
  122.                 Mark Rinfret for cleaning up my code and bringing up fnams
  123.                 from 1.0 to 2.0.
  124.                 Rahul Dhesi for writing ZOO in the first place.
  125.  
  126.         AUTHOR
  127.                 Svante Gellerstam
  128.  
  129.                 Please send hints, flames, bugs and/or suggestions to me
  130.                 at:
  131.  
  132.                                 USENET - d87sg@efd.lu.se
  133.  
  134. SHAR_EOF
  135. cat << \SHAR_EOF > history
  136.  
  137. <WayBack> - Svante Gellerstam   v1.0
  138.  
  139.                         Idea & code - first revision. No error checking.
  140.                         Stupid restictions on parameters. But it works.
  141.  
  142. summer 88 - Mark Rinfret        v2.0    (internal)
  143.  
  144.                         Grand revision. Prototypes etc for Lattice 4.0.
  145.                         Fnams now accepts input in a more intuitive way.
  146.                         Massive error checking.
  147.  
  148. 880608    - Svante Gellerstam   v2.1    (local distibution)
  149.  
  150.                         Small revision. Added linked lists of FIB's (see
  151.                         code). This allows for (almost) indefinite depth of
  152.                         the directory tree.
  153.  
  154. 881230    - Svante Gellerstam   v2.2    (release)
  155.  
  156.                         Small revision. Fixed some small bugs. A few small
  157.                         enhancements under Lattice. Better prototyping.
  158.                         Compiles with 16-bit int's. Fnams will now die
  159.                         cleanly when user hits Ctrl-C.
  160.  
  161. SHAR_EOF
  162. cat << \SHAR_EOF > zooall
  163. .key archive
  164. .bra (
  165. .ket )
  166. ;
  167. ; This script will zoo all files in current dir and below to (archive).
  168. ;
  169. fnams >t:fnams.tmp ""
  170. sort t:fnams.tmp t:fnams.tmp case
  171. zoo <t:fnams.tmp aI (archive)
  172. rm t:fnams.tmp
  173.  
  174. SHAR_EOF
  175. cat << \SHAR_EOF > makefile
  176. #
  177. # Makefile for Fnams v2.2 & Lattice 4.01.
  178. #
  179. # Aztec users should define the 'AZTEC_C' symbol.
  180. #
  181.  
  182. SHARS = readme fnams.man history zooall makefile fnams.c fnams.uu
  183. OBJS = fnams.o
  184. CFLAGS = -cef -v -w
  185.  
  186. fnams.sh        : $(SHARS)
  187.         shar >fnams.sh $(SHARS)
  188.  
  189. fnams   : $(OBJS)
  190.         blink lib:c.o $(OBJS) TO fnams LIB lib:amiga.lib lib:lcs.lib SC SD ND
  191.  
  192. fnams.uu        : fnams
  193.         uuencode >fnams.uu fnams fnams
  194.  
  195. clean:
  196.         -rm fnams
  197.         -rm fnams.o
  198.         -rm fnams.uu
  199.         -rm fnams.sh
  200.  
  201. SHAR_EOF
  202. cat << \SHAR_EOF > fnams.c
  203.  
  204. /* fnams.c */
  205. /* :ts=4 */
  206.  
  207.  
  208.    /* includes */
  209.  
  210. #include <libraries/dos.h>
  211. #include <exec/memory.h>
  212. #include <stdio.h>
  213.  
  214. #ifdef AZTEC_C
  215.    #include <functions.h>
  216. #else /* For Lattice */
  217.    #include <string.h>
  218.    #include <proto/exec.h>
  219.    #include <proto/dos.h>
  220. #endif
  221.  
  222.  
  223.    /* structure declarations */
  224.  
  225.       /*
  226.       This is our fib structure. It's compatible with the ordinary FIB plus
  227.       it has linkage fields too. We do this to avoid any hairy depth
  228.       problems with HD:s or other large disc devices with deeply nested
  229.       directory trees.
  230.       */
  231.  
  232. struct ext_fib
  233.    {
  234.    struct FileInfoBlock fib;
  235.    struct ext_fib *prev_fib, *next_fib;
  236.    BPTR   flock;
  237.    };
  238.  
  239.  
  240.    /* prototypes or casts */
  241.  
  242. #ifdef AZTEC_C
  243.    void    myputs();
  244. #else
  245.    void  exit(ULONG);
  246.    void  myputs(char *);
  247.    int   brk(void);
  248.    int   onbreak(int (*)());
  249.    void  chkabort(void);
  250. #endif
  251.  
  252.  
  253.    /* external declarations */
  254.  
  255. extern int      errno;
  256.  
  257.  
  258.    /* global structures */
  259.  
  260. char     dirstr[108];
  261. int      kris;
  262.                               /*
  263.                               For all you non swedish people out there: the
  264.                               word 'kris' translates to 'crisis' and is
  265.                               used as a flag telling whether we're in
  266.                               running shape or not. It is set to nonzero
  267.                               value to indicate an error. Thus the 'while
  268.                               (!kris)' below.
  269.                               */
  270.  
  271. void
  272. main(argc,argv)
  273. int     argc;
  274. char   *argv[];
  275.    {
  276.    struct ext_fib *currfib, *tempfib;
  277.    char errString[81];
  278.    char *killptr,temp;
  279.  
  280.    *errString = '\0';
  281.    kris = 0;
  282.  
  283.    if(argc < 2)
  284.       {
  285.       myputs("Fnams 2.2 - 8801230.  Author: Svante Gellerstam (d87sg@efd.lth.se).\n\n");
  286.       myputs("Fnams          - display this message.\n");
  287.       myputs("Fnams \"\"       - list current directory.\n");
  288.       myputs("Fnams <volume> - list the contents of <volume>.\n");
  289.       myputs("Fnams <dir>    - list the contents of <dir>.\n");
  290.       exit(20L);
  291.       }
  292.  
  293. #ifndef AZTEC_C
  294.    if(onbreak(&brk))
  295.       {
  296.       myputs("!!! Cannot set break trap!\n");
  297.       exit(100L);
  298.       }
  299. #endif
  300.  
  301.    if (!(currfib = (struct ext_fib *)
  302.           AllocMem((ULONG) sizeof(struct ext_fib), MEMF_PUBLIC|MEMF_CLEAR)))
  303.       {
  304.       strcpy(errString, "!!! No memory for root FileInfoBlock!");
  305.       kris = 1;
  306.       }
  307.  
  308.    strcpy(dirstr,argv[1]);
  309.  
  310.    if(!kris && ((currfib->flock = (BPTR) Lock(dirstr, ACCESS_READ)) == 0L))
  311.       {
  312.       sprintf(errString,"!!! Unable to lock %s, error %ld\n",
  313.                   dirstr,IoErr());
  314.       kris = 1;
  315.       }
  316.  
  317.    if (!kris && (Examine(currfib->flock, &currfib->fib) == 0))
  318.       {
  319.       sprintf(errString,"!!! Initial Examine call failed: %ld\n",IoErr());
  320.       kris = 1;
  321.       }
  322.  
  323.    if(!kris)
  324.       {
  325.       if (currfib->fib.fib_EntryType < 0L)
  326.          {
  327.          myputs("!!! Pathname argument must be volume or directory!\n");
  328.          kris = 1;
  329.          }
  330.       else
  331.          {
  332.  
  333.                    /* This program requires that the initial directory specification
  334.                         * be terminated with a colon or slash.  We already know that this
  335.                         * is either a directory or a device.  If the pathname isn't
  336.                         * terminated with a colon, it must be a directory.  If it's not
  337.                         * already terminated with a slash, just add one.  Oh - one other
  338.                         * thing.  If dirstr is null (user specified "" = current dir),
  339.                         * leave it alone.
  340.                         */
  341.  
  342.          if (*dirstr && (temp = dirstr[strlen(dirstr)-1]) != ':' &&
  343.                      temp != '/')
  344.             strcat(dirstr, "/");
  345.          }
  346.       }
  347.  
  348.    if(!kris && (ExNext(currfib->flock, &currfib->fib)== 0L))
  349.       {
  350.       sprintf(errString,"!!! Initial ExNext failed: %ld\n",IoErr());
  351.       kris = 1;
  352.       }
  353.  
  354.    while (!kris)
  355.       {                                 /* Who's kris? :-) */
  356.  
  357.       /* Is this entry a directory? */
  358.  
  359.       if(currfib->fib.fib_EntryType > 0L)
  360.          {
  361.          strcat(dirstr, currfib->fib.fib_FileName);
  362.          strcat(dirstr,"/");
  363.  
  364.          if(currfib->next_fib == NULL) /* Have to allocate a new fib */
  365.             {
  366.             if (!(currfib->next_fib = (struct ext_fib *)
  367.             AllocMem((ULONG) sizeof(struct ext_fib),MEMF_PUBLIC|MEMF_CLEAR)))
  368.                {
  369.                sprintf(errString, "!!! No memory for file info!\n");
  370.                kris = 1;
  371.                }
  372.             currfib->next_fib->prev_fib = currfib;
  373.             }
  374.  
  375.          if(!kris) /* Step down into the new fib */
  376.             currfib = currfib->next_fib;
  377.  
  378.          if (currfib->flock)
  379.             UnLock(currfib->flock);
  380.  
  381.          if((currfib->flock = (BPTR) Lock(dirstr,ACCESS_READ)) == NULL)
  382.             {
  383.             sprintf(errString, "!!! Unable to lock %s, error %ld\n",
  384.               dirstr, IoErr());
  385.             kris = 1;                         /* This is fatal. */
  386.             }
  387.          else
  388.             {
  389.             if (!kris && !Examine(currfib->flock, &currfib->fib))
  390.                {
  391.                sprintf(errString, "!!! Examine error on %s - %ld\n",
  392.                  dirstr, IoErr());
  393.                kris = 1;
  394.                }
  395.             }
  396.          }
  397.       else  /* No directory - process filename */
  398.          {
  399.          myputs(dirstr);
  400.          myputs(currfib->fib.fib_FileName);
  401.          myputs("\n");
  402.          }
  403.  
  404.       while((ExNext(currfib->flock, &currfib->fib) == 0L) && !kris )
  405.          {
  406.          UnLock(currfib->flock);
  407.          currfib->flock = 0L;
  408.  
  409.          if( currfib->prev_fib == NULL ) /* We're at root level. */
  410.             {
  411.             kris = 1;   /* Always true since this is the last entry! */
  412.             break;
  413.             }
  414.          else  /* We're at some lower than root level */
  415.             currfib = currfib->prev_fib;
  416.  
  417.          killptr = dirstr + strlen(dirstr) - 2;
  418.          while((*killptr != '/') && (*killptr != ':') && (killptr > dirstr))
  419.             killptr--;
  420.  
  421.          if((dirstr[0] != '/') && (dirstr[0] != ':') && (killptr == dirstr))
  422.             dirstr[0] = '\0';
  423.          else
  424.             *(killptr+1)= '\0';
  425.  
  426.          }
  427. #ifndef AZTEC_C
  428.       chkabort(); /* Peek at the Ctrl-C for Lattice */
  429. #endif
  430.       }
  431.  
  432.        /* Free up resources before leaving. */
  433.  
  434.       while(currfib->next_fib != NULL) /* Move to last fib in chain */
  435.          currfib = currfib->next_fib;
  436.  
  437.       while(currfib != NULL) /* Free up allocated fib:s */
  438.          {
  439.          if(currfib->flock)   /* UnLock locks when user did Ctrl-C */
  440.             UnLock(currfib->flock);
  441.          tempfib = currfib->prev_fib;
  442.          FreeMem((char *)currfib, (ULONG)sizeof(struct ext_fib));
  443.          currfib = tempfib;
  444.          }
  445.  
  446.    if (*errString)
  447.       {                                       /* There was an error. */
  448.       myputs(errString);                      /* Tell the user about it. */
  449.       }
  450.    }
  451.  
  452. void
  453. myputs(string)
  454. char   *string;
  455.    {
  456.    if (*string)
  457.       Write(Output(), string, (long)strlen(string));
  458.    }
  459.  
  460. #ifndef AZTEC_C
  461.  
  462. /*
  463.  *   Ctrl-C handling for Lattice
  464.  */
  465.  
  466. int
  467. brk()
  468.    {
  469.    myputs("***BREAK\n");
  470.    kris = 1;
  471.    return(0);
  472.    }
  473. #endif
  474.  
  475. SHAR_EOF
  476. cat << \SHAR_EOF > fnams.uu
  477.  
  478. begin 644 fnams
  479. M```#\P`````````"``````````$```10```!@````^D```102.=^_DOO`#0D+
  480. M2"0`2?D`````+'@`!"E.`$`I3P!,0JP`2)/)3J[^VB9`*6L`F``X2JL`K&<`)
  481. M`'`@#9"M``0&@````(`I0``$80`!>B!K`*S1R-'((F@`$-/)T\D@`G(`$ADI0
  482. M20!4T(%2@$)G4H`"0/_^G\!5@$)W"``@`E.`U($?L@``(`!3@E'(__8?O``@(
  483. M(`!3@A^Q(``@`%'*__@B3R\)8```;"EK`#H`!`:L````@``$80`!#F$``/@I&
  484. M0`!(+P`D0"`J`"1G$BQL`S`@0"(H```I00`X3J[_@B(J`"!G&B0\```#[4ZN/
  485. M_^(I0`!09PKEB"!`)V@`"`"D(&P`2"\(2&P``"!H`"0I:``$`%1'^0```]1RP
  486. M`"`\````BV`")L%1R/_\3KH*@'``8`0@+P`$+P`@+``L9P0@0$Z03KH'P"QX`
  487. M``0B;`,P3J[^8DJL`SAG"")L`SA.KOYB2JP#/&<((FP#/$ZN_F)*K`!89P@B2
  488. M;`!83J[^8DJL`$AG)"(L`#QG!$ZN_]PB+`!09P1.KO_<+'@`!$ZN_WPB;`!(*
  489. M3J[^AB`?+FP`3$S??WY.=7!D8(!!ZP!<3J[^@$'K`%Q.KOZ,3G5#[`!<<`!.@
  490. MKOW8*4`#,&?:3G4``$Y5_Z!(YR`B0BW_IT)L!$`,;0`"``AL/$AL`&AA``0X!
  491. M6$](;`"N80`$+EA/2&P`UF$`!"183TAL`0!A``0:6$](;`$R80`$$%A/2'@`;
  492. M%$ZZ!2!83TAZ!$A.N@T"6$]*0&<42&P!8&$``^Y83TAX`&1.N@3^6$\@/```X
  493. M`1`B/``!``$L>``$3J[_.BM`__Q*K?_\9A1![`%\(DA%[?^G%-EF_#E\``$$5
  494. M0")M``H@:0`$(DA%[`/4%-EF_$IL!$!F1D'L`]0B"'3^+&P#,$ZN_ZP@;?_\G
  495. M(4`!#"!M__Q*J`$,9B0L;`,P3J[_?"\`2&P#U$AL`:)(;?^G3KH#MD_O`!!PL
  496. M`3E`!$!*;`1`9C8@;?_\(B@!#"0(+&P#,$ZN_YI*@&8@+&P#,$ZN_WPO`$ALT
  497. M`<1(;?^G3KH#>D_O``QP`3E`!$!*;`1`9EH@;?_\(B@`>$J!:A)(;`'J80`"J
  498. M_%A/.7P``01`8#Q*+`/49S9![`/4(DA*&6;\4XF3R"`)0>P#T]#`$!`;0/^AD
  499. M#```.F<4#```+V<.2&P"'DAL`]1.N@M:4$]*;`1`9C8@;?_\(B@!#"0(+&P#8
  500. M,$ZN_Y1*@&8@+&P#,$ZN_WPO`$AL`B!(;?^G3KH"WD_O``PY?``!!$!*;`1`7
  501. M9@`"#"!M__PB*`!X2H%O``$<(DA0B2\)2&P#U$ZZ"OA03TAL`D!(;`/43KH*7
  502. MZE!/(&W__$JH`0AF1B`\```!$"(\``$``2QX``1.KO\Z(&W__"%``0@@;?_\<
  503. M2J@!"&842&P"0DAM_Z=.N@)D4$]P`3E`!$`B;?_\(&D!""%)`01*;`1`9@H@8
  504. M;?_\*V@!"/_\(&W__$JH`0QG#"(H`0PL;`,P3J[_ID'L`]0B"'3^+&P#,$ZNC
  505. M_ZP@;?_\(4`!#"!M__Q*J`$,9B8L;`,P3J[_?"\`2&P#U$AL`F!(;?^G3KH!J
  506. M[D_O`!!P`3E`!$!@8$IL!$!F6B(H`0PD""QL`S!.KO^:2H!F2"QL`S!.KO]\!
  507. M+P!(;`/42&P"@DAM_Z=.N@&P3^\`$#E\``$$0&`B2&P#U&$``4)83R!M__Q0^
  508. MB"\(80`!-%A/2&P"HF$``2I83R!M__PB*`$,)`@L;`,P3J[_E$J`9@``HDILT
  509. M!$!F``":(&W__"(H`0PL;`,P3J[_IG``(&W__"%``0Q*J`$$9@@Y?``!!$!@T
  510. M<"MH`03__$'L`]0B2$H99OQ3B9/((`G0P%6(*TC_HB!M_Z(2$`P!`"]G%`P!K
  511. M`#IG#D/L`]2QR6,&4ZW_HF#@$"P#U`P``"]G'`P``#IG%D'L`]0B;?^BL\AFB
  512. M"G``&4`#U&``_U8@;?^B0B@``6``_TI.N@F*8`#]\"!M__Q*J`$(9P@K:`$(7
  513. M__Q@[DJM__QG."!M__Q*J`$,9PPB*`$,+&P#,$ZN_Z8@;?_\*V@!!/_X(D@@X
  514. M/````1`L>``$3J[_+BMM__C__&#"2BW_IV<(2&W_IV$*6$],WT0$3EU.=4Y5'
  515. M__A(YS`"(&T`"$H09S`L;`,P3J[_Q"!M``A*&&;\4XB1[0`((@A(P2]!`!`BW
  516. M`"0M``@F+P`0+&P#,$ZN_]!,WT`,3EU.=4AL`J1ALEA/.7P``01`<`!.=4CGI
  517. M`#HF;P`4(&\`&$/O`!Q%^@`2+'D````$3J[]]DS?7`!.=1;`3G5(YS`R+'D`:
  518. M``,T(&\`&")O`!PD;P`@)F\`)"`O`"@B+P`L)"\`,"8O`#1.KOZD3-],#$YU;
  519. M3E7__DCG(`!P`#E``!A*;0`(:R8R+0`(LFP#+&P<(`%T!L'"0>P%$")(TL!*B
  520. M46<*(`'!PM#`(`A@"#E\``D"L'``3-\`!$Y=3G4``````[@```.T```#?```T
  521. M`W(```-6```#1DY5__A(YP`@1>P"N+3\``!G-`@J``(`$V8H""H``0`39R`@X
  522. M*@`$D*H`##M`__Q*0&<0/P`O*@`,/RH`%$ZZ`[903R128,8_+0`(3KH'5%1/"
  523. M3-\$`$Y=3G4```-R``!P84Y5__8_+0`(3KK_,E1/*T#_]DJ`9@1P_V`J/RT`$
  524. M#B\M``H@;?_V+R@``DZZ""A/[P`**T#_^DIL`!AG!'#_8`0@+?_Z3EU.=4Y56
  525. M__@@+0`(!H`````*+T```"`O``!R`"QX``1.KO\Z*T#__$JM__QF!'``8#0@/
  526. M+0`(!H`````*(&W__#%```@O"$AL!$1A``$04$]*K`,89@8I;?_\`Q@@;?_\[
  527. MT/P`"B`(3EU.=4Y5__QP`#`M``@O`&&,6$\K0/_\2H!F!'#_2,!.74YU3E7_#
  528. M^$CG`2!A``"`<``I0``0*4``""E```PI0`,B*4`#)BE``QPI0`,80FP#($JLK
  529. M`Q1G3"`L`T`B+`,4TH!3@2`!(BP#0$ZZ!0(B+`-`3KH%OE"`+@`@!R`'5H#D'
  530. M@.6`+@`O!V$`_Q183R1`M/P``&8$</]@#"\'+PI.N@#"4$]P`$S?!(!.74YUB
  531. M3E7_]"ML!$3__$JM__QG*B!M__PK4/_X<``P*``(+T```")M__P@+P``+'@`I
  532. M!$ZN_RXK;?_X__Q@T)'(*4@$2"E(!$1.74YU3E4``$CG`"`B;0`((&D`!")M)
  533. M``PC2``$D<@BB"1M``A*DF8")(E*J@`$9P8@:@`$((DE20`$3-\$`$Y=3G4`S
  534. M```"````````````$D`!````!0````(``````````"L5$D`!````!0```'!A%
  535. M3E7__'``,"T`#"\`+RT`""M`__QA!E!/3EU.=4Y5_^A(YR$P+BT`#$J';@9P*
  536. M_V```/`,AP````AL`GX((`<@!U:`Y(#E@"X`(&T`""M(__31Q]^L`R9#[`,B4
  537. M)%$K2/_P*TG_^+3\``!G``"B($H@*@`$($K1P"M(_^PD+?_PM<)C%B)M__0B@
  538. MBB-'``0F;?_X)HEP`&```(JUPF8>(E(F;?_T)HD@*@`$(@#2AR=!``0B;?_XJ
  539. M(HMP`&!F(FW_]+/(9`B?K`,F</]@5K/(9BY*DF<.(A*T@6,(GZP#)G#_8$#?[
  540. MJ@`$2I)G$+229@P@0B`H``31J@`$))!P`&`D*TK_^"MM_^S_Z"128`#_6B!M@
  541. M__@@K?_T(&W_]$*0(4<`!'``3-\,A$Y=3G5.5?_Z2.<!`"!M``Q*&&;\4XB1C
  542. M[0`,+@@@;0`(2AAF_%.(D>T`""`((FT`"-+`*TG_^C(M`!"^06,"+@$@!R!M=
  543. M``Q@`A+84<C__"!M__I",'``("T`"$S?`(!.74YU``!.5?_Z/RT`"$ZZ^YY4'
  544. M3RM`__I*@&8$</]@1B!M__H(*``#``%G$'`"/P!"IS\M``A.NOPZ4$\_+0`.2
  545. M+RT`"B!M__HO*``"3KH$'$_O``H[0/_^2FP`&&<$</]@!#`M__Y.74YU`")*M
  546. MD```<&%.5?_R2.<!,"1M``@,;``@!%!L``"0$A(,`0`@9PP,`0`)9P8,`0`*T
  547. M9@12BF#H2A)G<C`L!%#E0%)L!%!![`16T,`K2/_\#!(`(F8H4HH@BDH29PH,<
  548. M$@`B9P12BF#R2A)F#'`!/P!.N@+85$]@GD(24HI@F"!M__P@BDH29Q@2$@P!T
  549. M`"!G$`P!``EG"@P!``IG!%**8.1*$F8"8`A"$E**8`#_:DIL!%!F!B!L`$A@/
  550. M!$'L!%8I2`122FP$4&8``(9![`,`(DA'[`36)MDFV2;9)MDVD29L`$@B:P`D]
  551. M<"@_`"\I``1(;`363KK^2D_O``I![`36(@@D/````^XL;`,P3J[_XBE`!1(@C
  552. M+`42*4`%&'($.4$%%BE`!1XY004<Y8`K0/_RD\DL>``$3J[^VBM`__8@;?_RR
  553. M(FW_]B-H``@`I'X`8#(L;`,P3J[_RBE`!1(L;`,P3J[_Q"E`!1A![`,2(@@D[
  554. M/````^TL;`,P3J[_XBE`!1Y^!"`'(`<`0(`!@6P%$"`'(`<`0(`"@6P%%@!LW
  555. M@`,%'$IL`K1G!'``8`0P/(``+@!";`+,(`<@!P!```$Y0`+*.7P``0+D(`<@<
  556. M!P!```(Y0`+B.7P``@+\(`<@!P!``(`Y0`+Z0?H#*BE(`#`O+`12/RP$4$ZZ?
  557. M]$9<3T)G3KKYKE1/3-\,@$Y=3G4``````````````````````````````",4\
  558. M\$J`:@``'D2`2H%J```,1(%A```@1(%.=6$``!A$@$2!3G5*@6H```Q$@6$`!
  559. M``9$@$YU+P)(030!9@``(DA`2$%(0C0`9P``!H3!,`)(0#0`A,$P`DA",@(D,
  560. M'TYU+P-V$`Q!`(!D```&X9E10PQ!"`!D```&Z9E90PQ!(`!D```&Y9E50TI!T
  561. M:P``!N.94T,T`.:H2$)"0N:J2$.`P38`,`(T`TA!Q,&0@F0```A30]"!9/YR5
  562. M`#(#2$/GN$A`PT`F'R0?3G4@0B)#)``F`4A"2$/$P<;`P,'40TA"0D+0@B8).
  563. M)`A.=2!O``@B;P`$,"\`#&\8L\AE$-#`TL!30!,@4<C__&`&$MA1R/_T("\`D
  564. M!$YU(&\`"")O``1*&6;\4XD2V&;\("\`!$YU3E7_^DCG`2!^`$7L!1"^;`,L_
  565. M;!Y*4F<4""H``@`!9P)@"B\J``).N@%\6$]21UR*8-PP+0`(2,`O+0`*+P!.[
  566. MNO(&4$],WP2`3EU.=2`O``1F!B`\```0K"/`````,'``3G4``$Y5__QP`"(\W
  567. M```P`"QX``1.KO[.`H```#``*T#__$J`9@1P`&`D2JP`,&<:(&P`,$Z02D!F1
  568. M!'``8!!"9W`4/P!.NO]:6$\@+?_\3EU.=6&P3G4``$Y5__A(YP$`2JP`,&<$]
  569. M3KK_G$)L`!@P+0`02,`O0``$(BT`""0M``PF+P`$+&P#,$ZN_]`N``R'____R
  570. M_V82+&P#,$ZN_WPY0``8.7P`!0*P(`=,WP"`3EU.=0``3E7_^$CG,0)*K``P8
  571. M9P1.NO]`0FP`&'``,"T`$%.`+T``$"(M``@D+0`,)B\`$"QL`S!.KO^^+@`,^
  572. MA_____]F$BQL`S!.KO]\.4``&#E\`!8"L#`M`!`,0``"9QH,0``!9PI*0&8B7
  573. M("T`#&`<(`<@!]"M``Q@$B(M``AT`'8`+&P#,$ZN_[Y.<4S?0(Q.74YU3E4`J
  574. M`$JL`#!G!$ZZ_K0B+0`(+&P#,$ZN_]QP`$Y=3G5.5?^P2.<``DJL`S1F$D/LY
  575. M`\!P`"QX``1.KOW8*4`#-'``(&P`5!`H__\O`"\(2&W_L$ZZ_<1/[P`,(&P`[
  576. M5!`H__\"0`#_0C4`L$'M_[`I2`.`2'@`/$AX`/IP`"\`+P!(;`.L2&P#DDALG
  577. M`W0O`$ZZ]91/[P`@4X!G!'#_8`)P`$S?0`!.74YU3-]`C$Y=3G7FJ$A"```#M
  578. M[`````$````````//`````0````!```/0@``!K8```$2````#@````````/R@
  579. M```#Z@```/4`````````````````````````````````````````````````B
  580. M`````````````````````````````````````````````````````````````
  581. M`````````````&1O<RYL:6)R87)Y`$9N86US(#(N,B`M(#@X,#$R,S`N("!!2
  582. M=71H;W(Z(%-V86YT92!'96QL97)S=&%M("AD.#=S9T!E9F0N;'1H+G-E*2X*N
  583. M"@!&;F%M<R`@("`@("`@("`M(&1I<W!L87D@=&AI<R!M97-S86=E+@H`1FYAL
  584. M;7,@(B(@("`@("`@+2!L:7-T(&-U<G)E;G0@9&ER96-T;W)Y+@H`1FYA;7,@2
  585. M/'9O;'5M93X@+2!L:7-T('1H92!C;VYT96YT<R!O9B`\=F]L=6UE/BX*``!&/
  586. M;F%M<R`\9&ER/B`@("`M(&QI<W0@=&AE(&-O;G1E;G1S(&]F(#QD:7(^+@H`&
  587. M(2$A($-A;FYO="!S970@8G)E86L@=')A<"$*`"$A(2!.;R!M96UO<GD@9F]R9
  588. M(')O;W0@1FEL94EN9F]";&]C:R$`(2$A(%5N86)L92!T;R!L;V-K("5S+"!EK
  589. M<G)O<B`E;&0*`"$A(2!);FET:6%L($5X86UI;F4@8V%L;"!F86EL960Z("5L$
  590. M9`H`(2$A(%!A=&AN86UE(&%R9W5M96YT(&UU<W0@8F4@=F]L=6UE(&]R(&1I8
  591. M<F5C=&]R>2$*`"\`(2$A($EN:71I86P@17A.97AT(&9A:6QE9#H@)6QD"@`OX
  592. M`"$A(2!.;R!M96UO<GD@9F]R(&9I;&4@:6YF;R$*`"$A(2!5;F%B;&4@=&\@4
  593. M;&]C:R`E<RP@97)R;W(@)6QD"@`A(2$@17AA;6EN92!E<G)O<B!O;B`E<R`M,
  594. M("5L9`H```H`*BHJ0E)%04L*`````````(````````+0````````````````H
  595. M``````````````+H````````````````````````````````````````````J
  596. M``````````````!C;VXZ,3`O,3`O,S(P+S@P+P`J````````````````````?
  597. M```````````````H````````````````````````!````"HJ(%5S97(@06)OQ
  598. M<G0@4F5Q=65S=&5D("HJ``#__P````X`#@````````-$`````/__````!``$3
  599. M``````````````-@0T].5$E.544``/__````!``$`````````X@`````04)/K
  600. M4E0`__\````$``0````````#I@````!I;G1U:71I;VXN;&EB<F%R>0``````;
  601. J`^P````&`````0```[@```.>```#A````VP```+0```"N`````````/R)
  602. ``
  603. end
  604. size 5532
  605. SHAR_EOF
  606. #    End of shell archive
  607. exit 0
  608. -- 
  609. Bob Page, U of Lowell CS Dept.  page@swan.ulowell.edu  ulowell!page
  610. Have five nice days.
  611.